import jwt
from jwt import PyJWTError
from common.utils import const
from flask import current_app
from common.models.user import User
from datetime import datetime,timedelta

# 生成密钥
def generate(uid):
    '''
    根据已经登录之后的用户id。生成token
    :param uid:用户id
    :return:
    '''
    payload = {
        'id':uid,
        # exp 代表token有效时间，而且必须是标准时间
        'exp':datetime.utcnow()+timedelta(const.JWT_EXPIRY_SECOND)
    }
    # 参数1：payload是一个字典包括加密的用户ID和有效按时间
    # 参数2：密钥
    # 参数3：算法

    s = jwt.encode(payload=payload,key=const.SECRET_KEY,algorithm='HS256')
    # 生成token
    return s

def verify_tokens(token_str):
    '''
    验证token，并且验证成功后，返回用户ID
    :param token_str:
    :return:
    '''
    try:
        data = jwt.decode(token_str,key=const.SECRET_KEY, algorithms='HS256')
    except PyJWTError as e:
        current_app.logger.info(e)
        return {'message':'token 验证失败'}
    # 如果token验证成功，还需要看用户状态是否正常
    user = User.query.filter(User.id == data['id']).first()
    if user and user.status != 0:
        return {'message':'用户状态过期'}
    return {'id':user.id}
